package com.aiit.config;

import at.pollux.thymeleaf.shiro.dialect.ShiroDialect;
import org.apache.shiro.authz.Authorizer;
import org.apache.shiro.authz.ModularRealmAuthorizer;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.mgt.SessionsSecurityManager;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

import java.util.LinkedHashMap;
import java.util.Map;

@Configuration

public class ShiroConfig {

    /**配置一个SecurityManager安全管理
     * @return*/
    @Bean
    public SessionsSecurityManager securityManager(@Qualifier("myRealm")MyRealm myRealm){
        DefaultWebSecurityManager defaultWebSecurityManager=new DefaultWebSecurityManager();
        defaultWebSecurityManager.setRealm(myRealm);
        return defaultWebSecurityManager;
    }
    /** 配置一个自定义的Realm,最终将使用这个bean返回的对象来完成我们的认证和授权*/
    @Bean
    public MyRealm myRealm(){
        MyRealm myRealm=new MyRealm();
        return myRealm;
    }

    /**配置一个shiro的过滤bean,这个bean将配置shiro相关的一个规则的拦截
     例如什么可以访问什么样的不能访问*/
    @Bean(name = "filterShiroFilterRegistrationBean")
    public ShiroFilterFactoryBean shiroFilterFactory(@Qualifier("securityManager") SecurityManager securityManager){
        //创建过滤器配置bean
        ShiroFilterFactoryBean shiroFilterFactoryBean=new ShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        shiroFilterFactoryBean.setLoginUrl("/admin/login");//配置用户登录请求，如果需要进行登录时，shiro会跳转到这个请求登录页面
        shiroFilterFactoryBean.setSuccessUrl("/main/main");//登录成功后转向的请求地址
        shiroFilterFactoryBean.setUnauthorizedUrl("/admin/index");//配置没有权限时转向的请求地址

        /**配置权限拦截规则*/
        Map<String,String> filterChainMap=new LinkedHashMap<>();
        filterChainMap.put("/static/**","anon");
        filterChainMap.put("/css/**","anon");//允许访问静态资源
        filterChainMap.put("/images/**","anon");
        filterChainMap.put("/js/**","anon");
        filterChainMap.put("/Captcha.jpg","anon");//开放验证码权限
        filterChainMap.put("/admin/login","anon");//anon配置登录请求不需要认证
        filterChainMap.put("/logout","logout");//配置登录的请求，登录后会请求当前用户的内存

        filterChainMap.put("/admin/**","anon");//配置一个admin开头的所有请求需要登录 authc表示需要登录认证,没登录返回登录页面
        filterChainMap.put("/user/**","anon");//配置一个user开头的所有请求需要登录 authc表示需要登录认证，同上

        /**配置剩余的所有请求全部需要进行登录认证(这个必须放到最后)*/
        filterChainMap.put("/**","anon");

        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainMap);
        return shiroFilterFactoryBean;

    }
    //整合ShiroDialect,用来整合shiro thymeleaf
    @Bean
    public ShiroDialect getShiroDialect(){
        return new ShiroDialect();
    }

    @Bean
    public Authorizer authorizer(){
        return new ModularRealmAuthorizer();
    }

}
